home *** CD-ROM | disk | FTP | other *** search
/ Power Programmierung / Power-Programmierung (Tewi)(1994).iso / magazine / drdobbs / 1987 / 11 / stack.c < prev    next >
C/C++ Source or Header  |  1987-10-08  |  3KB  |  156 lines

  1. /*-----------------------------------------------------------
  2.     stack.c
  3.     
  4.     implements a simple stack of integers
  5.     
  6.     William May
  7.     303A Ridgefield Circle
  8.     Clinton, MA 01510
  9.     
  10.     2/20/87        created
  11.   -----------------------------------------------------------*/
  12.  
  13. #ifdef DEBUG
  14. #include <stdio.h>
  15. #endif
  16.  
  17. #include <storage.h>
  18.  
  19. typedef struct STACK {
  20.     int max;        /* max items in stack */
  21.     int top;        /* current items in stack */
  22.     int items[];    /* the data */
  23. } STACK;
  24.  
  25. /* some error codes */
  26. #define FULL  -2
  27. #define EMPTY -1
  28. #define NOERR  0
  29.  
  30. #ifdef DEBUG
  31.  
  32. STACK *mystack;
  33.  
  34. main()
  35. {
  36.     STACK *init_stack();
  37.     int num, c;
  38.     
  39.     printf("Stack program begun\n");
  40.     
  41.     if (!(mystack = init_stack(5))) {
  42.         fprintf(stderr, "Insufficient memory to create stack\n");
  43.         ExitToShell();
  44.     }
  45.     
  46.     while( 1 ) { 
  47.         num = c = -1;
  48.     
  49.         printf("top         = %d\n", mystack->top);
  50.         printf("max         = %d\n", mystack->max);
  51.         printf("top item = %d\n", top_of_stack(mystack));
  52.  
  53.  
  54.         printf("\n<p(op)/s(push)/q(uit)> -> ");
  55.         while( c != 'p' && c != 's' && c != 'q' )
  56.             c = getchar();
  57.  
  58.         if( c == 's' )
  59.         {            
  60.             printf("\nenter decimal number -> ");
  61.             scanf("%d", &num );
  62.             printf("\npush(%d) returned %d\n",
  63.                         num, push(num, mystack));
  64.         }
  65.         else if( c == 'p' )
  66.         {
  67.             printf( "\npop returned: %d\n", pop(mystack));
  68.         }
  69.         else
  70.             break;
  71.     }
  72.  
  73.     del_stack(&mystack);
  74.     
  75.     printf("\nStack program complete\n");
  76. }
  77. #endif
  78.  
  79. /*-------------------------------------------------------------------
  80.     create the stack
  81.     NULL returned if insufficient memory
  82.   -------------------------------------------------------------------*/
  83. STACK *init_stack    ( items )
  84. int items;
  85. {
  86.     STACK * p;
  87.     
  88.     if (p = (STACK *)calloc ((sizeof(int) * items + sizeof(STACK)),1)) {
  89.         p->max = items;
  90.         p->top = EMPTY;
  91.     }
  92.     
  93.     return (p);
  94. }
  95.  
  96. /*-------------------------------------------------------------------
  97.     delete the stack
  98.   -------------------------------------------------------------------*/
  99. void del_stack ( stackptr )
  100. STACK **stackptr;
  101. {
  102.     free(*stackptr);
  103.     *stackptr = 0L;
  104. }
  105.  
  106. /*-------------------------------------------------------------------
  107.     is the stack empty?
  108.   -------------------------------------------------------------------*/
  109. int empty ( stack )
  110. STACK *stack;
  111. {
  112.     return ((stack->top == EMPTY) ? 1 : 0);
  113. }
  114.  
  115. /*-------------------------------------------------------------------
  116.     return the top element of the stack and decrement
  117.     the stack pointer
  118.   -------------------------------------------------------------------*/
  119. int pop ( stack )
  120. STACK *stack;
  121. {
  122.     if (empty(stack))
  123.         return EMPTY;
  124.     else {
  125.         return (stack->items[stack->top--]);
  126.     }
  127. }
  128.  
  129. /*-------------------------------------------------------------------
  130.     push an integer onto the stack and increment the stack pointer
  131.   -------------------------------------------------------------------*/
  132. int push (n, stack)
  133. int n;
  134. STACK *stack;
  135. {
  136.     if (++stack->top < stack->max) {
  137.         stack->items[stack->top] = n;
  138.         return NOERR;
  139.     }
  140.     else {
  141.         --stack->top;
  142.         return FULL;
  143.     }
  144. }
  145.  
  146. /*-------------------------------------------------------------------
  147.     look at the top of the stack without changing the
  148.     stack pointer
  149.   -------------------------------------------------------------------*/
  150. int top_of_stack( stack )
  151. STACK *stack;
  152. {
  153.     return (stack->items[stack->top]);
  154. }
  155.  
  156.